#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QString>
#include <QMutex>
#include <QDebug>

/**
 * @brief 数据库管理器单例类
 * 
 * 这个类使用单例模式来管理数据库连接，确保整个应用程序只有一个数据库实例。
 * 支持SQLite数据库，提供基本的数据库操作功能。
 */
class DatabaseManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取数据库管理器实例
     * @return 数据库管理器实例的引用
     */
    static DatabaseManager& getInstance();
    
    /**
     * @brief 初始化数据库连接
     * @param databasePath 数据库文件路径
     * @return 初始化是否成功
     */
    bool initialize();
    QSqlDatabase m_database;    ///< 数据库连接对象
    /**
     * @brief 关闭数据库连接
     */
    void close();
    
    /**
     * @brief 检查数据库是否已连接
     * @return 数据库连接状态
     */
    bool isConnected() const;
    
    /**
     * @brief 执行SQL查询
     * @param queryString SQL查询字符串
     * @return 查询对象
     */
    QSqlQuery executeQuery(const QString& queryString);
    
    /**
     * @brief 执行SQL查询并返回结果
     * @param queryString SQL查询字符串
     * @return 查询是否成功
     */
    bool executeQuery(const QString& queryString, QSqlQuery& query);
    
    /**
     * @brief 创建表
     * @param tableName 表名
     * @param columns 列定义
     * @return 是否成功创建表
     */
    bool createTable(const QString& tableName, const QString& columns);
    
    /**
     * @brief 创建必要的表（侧板表和模具表）
     * @return 是否成功创建所有必要的表
     */
    bool createRequiredTables();

    QString getLastError();

private:
    /**
     * @brief 私有构造函数，实现单例模式
     */
    explicit DatabaseManager(QObject* parent = nullptr);
    
    /**
     * @brief 私有析构函数
     */
    ~DatabaseManager();
    
    /**
     * @brief 禁用拷贝构造函数
     */
    DatabaseManager(const DatabaseManager&) = delete;
    
    /**
     * @brief 禁用赋值操作符
     */
    DatabaseManager& operator=(const DatabaseManager&) = delete;
    
    QString m_lastError;        ///< 最后的错误信息
    mutable QMutex m_mutex;     ///< 线程安全互斥锁
    bool m_isConnected;         ///< 连接状态标志
};

#endif // DATABASEMANAGER_H
